package methods;

import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) throws Exception {
        // Get method pointers to the square and sqrt methods
        Method square = Main.class.getMethod("square", double.class);
        Method sqrt = Math.class.getMethod("sqrt", double.class);

        // Print tables of x- and y- values
        printTable(1, 10, 10, square);
        printTable(1, 10, 10, sqrt);
    }

    /**
     * Returns the square of a number
     * @param x a number
     * @return x squared
     */
    public static double square(double x) {
        return x * x;
    }

    /**
     * Prints a table with x- and y-values for a method
     * @param from the lower bound for the x-values
     * @param to the upper bound for the x-values
     * @param n the number of rows in the table
     * @param func a method with a double parameter and double return value
     */
    public static void printTable(double from, double to, int n, Method func) {
        // Print out the method as table header
        System.out.println(func);

        double interval = (to - from) / (n - 1);

        for (double x = from; x <= to; x += interval) {
            try {
                double y = (Double) func.invoke(null, x);
                System.out.printf("%10.4f | %10.4f%n", x, y);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
